package pe.com.hermes.hermetic.web.controller.general;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.bind.annotation.SessionAttributes;

import pe.com.hermes.hermetic.beans.PuntoBean;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.negocio.ultil.Util;
import pe.com.hermes.hermetic.web.controller.base.IController;
import pe.com.hermes.hermetic.web.forms.SelecBancoForm;
import pe.com.hermes.hermetic.web.forms.SelecPuntoForm;

@Controller
@RequestMapping("/selecPuntoCC.html")
@SessionAttributes(value = { "form" })
public class SeleccionarPuntoCCController implements IController {
    protected final static Logger logger =
        Logger.getLogger(SeleccionarPuntoController.class);
    @Autowired
    private HermeticFacade servicioHermetic;

    @RequestMapping(method = { RequestMethod.GET })
    protected String showForm(ModelMap model,HttpServletRequest request) throws Exception {
        try {
            logger.info(this.getClass().toString() + " " + "metodo: GET");
            SelecPuntoForm form = new SelecPuntoForm();
            String v_cliente = request.getParameter("vCliente");
            String v_sucrusal = request.getParameter("vSucursal");
            String v_codCliente = request.getParameter("vCodClie");
            String codSucursal = (String)request.getSession(false).getAttribute("sucursal");
            form.setVCliente(v_cliente);
            form.setVSucursal(v_sucrusal);
            if (v_cliente.equals("1")) {
                String listCodClies = "";
                if (v_codCliente != null ){
                  listCodClies = v_codCliente;
                }else{
                  String[] codClies = (String[])request.getSession(false).getAttribute("chksClieCorp");
                  if (codClies != null)
                      for (int i = 0; i < codClies.length; i++) {
                          if(codClies[i]!=null){
                            if (i == 0)
                                listCodClies = codClies[i];
                            else
                                listCodClies = listCodClies + "," + codClies[i];
                          }
                      }  
                }    
                
                logger.info("lista de puntos seleccionados :"+listCodClies);
                form.setListCodClientes(listCodClies);
            } else                                          
                form.setListCodClientes((String)request.getSession(false).getAttribute("listClie"));
            
            if(codSucursal.equals(COD_SUCU_PRINCIPAL)){
                if (v_sucrusal.equals("1")) {
                    String listCodSucurs = "";
                    String[] codSucurs =
                        (String[])request.getSession(false).getAttribute("chksSucu");
                    if (codSucurs != null)
                        for (int i = 0; i < codSucurs.length; i++) {
                            if (i == 0)
                                listCodSucurs = codSucurs[i];
                            else
                                listCodSucurs = listCodSucurs + "," + codSucurs[i];
                        }
                    logger.info("tomando en cuenta lista de sucursales....: "+listCodSucurs);
                    form.setListCodSucursales(listCodSucurs);
                } else if(v_sucrusal.equals("0"))
                    form.setListCodSucursales("");
            }
            else{
              form.setListCodSucursales(codSucursal);
            }
            
            String tipoPunt = request.getParameter("tipoPunt");
            //List listSucursales = servicioHermetic.getSucursalesNoTodos();
            List listPuntos = new ArrayList();
            listPuntos =
                    servicioHermetic.getPuntosPorCliente(form.getListCodClientes(),
                                                         "",
                                                         form.getListCodSucursales());

            //asigno los valores de las cuentas seleccionadas en session
            String[] chksPunto =
                (String[])request.getSession(false).getAttribute("chksPunto");
            listPuntos = Util.setChksSession(chksPunto, listPuntos);
            form.setListPuntos(listPuntos);
            request.getSession(false).setAttribute("listPuntos", listPuntos);
            model.put("listPuntos", listPuntos);
            model.put(FORM_KEY, form);
            return FORM_SELECT_PUNTO_CC;
        } catch (Exception e) {
            logger.error(e);
            return FORM_ERROR_POPUP_VIEW;
        }
    }

    @RequestMapping(params = { "accion=buscarPunto", "desPunto","vCliente","vSucursal" })
    protected String buscarPunto(@RequestParam("desPunto")
        String desPunto,@RequestParam("vCliente")String vCliente,@RequestParam("vSucursal")String vSucursal, ModelMap model,
        HttpServletRequest request) throws Exception {
        logger.info(this.getClass().toString() + " " + "metodo: GET");
        String codSucursal = (String)request.getSession(false).getAttribute("sucursal");
        SelecPuntoForm form = new SelecPuntoForm();
        
        if (vCliente.equals("1")) {
            String listCodClies = "";
            String[] codClies =
                (String[])request.getSession(false).getAttribute("chksClieCorp");
            if (codClies != null)
                for (int i = 0; i < codClies.length; i++) {
                    if (i == 0)
                        listCodClies = codClies[i];
                    else
                        listCodClies = listCodClies + "," + codClies[i];
                }
            form.setListCodClientes(listCodClies);
        } else                                        
            form.setListCodClientes((String)request.getSession(false).getAttribute("listClie"));
        if(codSucursal.equals(COD_SUCU_PRINCIPAL)){
            if (vSucursal.equals("1")) {
                String listCodSucurs = "";
                String[] codSucurs =
                    (String[])request.getSession(false).getAttribute("chksSucu");
                if (codSucurs != null)
                    for (int i = 0; i < codSucurs.length; i++) {
                        if (i == 0)
                            listCodSucurs = codSucurs[i];
                        else
                            listCodSucurs = listCodSucurs + "," + codSucurs[i];
                    }
                form.setListCodSucursales(listCodSucurs);
            } else 
                form.setListCodSucursales("");
        }else{
          form.setListCodSucursales(codSucursal);
        }

        String[] chksPunto =
            (String[])request.getSession(false).getAttribute("chksPunto");
        List listPuntos = new ArrayList();
        String tipoPunt =
            (String)request.getSession(false).getAttribute("tipoPunt");
        if (tipoPunt == null)
            tipoPunt = "0";
        listPuntos =
                servicioHermetic.getPuntosPorCliente(form.getListCodClientes(),
                                                     desPunto,
                                                     form.getListCodSucursales());
        listPuntos = Util.setChksSession(chksPunto, listPuntos);
        form.setListPuntos(listPuntos);
        if (desPunto.equals(""))
            request.getSession(false).setAttribute("listPuntos", listPuntos);
        model.put("listPuntos", listPuntos);
        model.put(FORM_KEY, form);
        return FORM_SELECT_PUNTO_CC;
    }

    @RequestMapping(params = { "accion=searchDesPunto" })
    @ResponseBody
    protected String[] searchDesPunto(HttpServletRequest request) throws Exception {
        logger.info(this.getClass().toString() + " " +
                    "metodo: searchDesPunto");
        List listModulos =
            (List)request.getSession(false).getAttribute("listPuntos");
        String[] arrayModulos = new String[listModulos.size()];
        for (int i = 0; i < listModulos.size(); i++) {
            PuntoBean pBean = (PuntoBean)listModulos.get(i);
            if (pBean.getBancDesc() == null ||
                pBean.getBancDesc().trim().equals(""))
                arrayModulos[i] = pBean.getDesPunto();
            else
                arrayModulos[i] = pBean.getBancDesc();
        }
        return arrayModulos;
    }

    @RequestMapping(params = { "accion=selectCodPunto", "codPunto" })
    @ResponseBody
    protected String[] selectCodPunto(@RequestParam("codPunto")
        String codPunto, @ModelAttribute(FORM_KEY)
        SelecPuntoForm form, HttpServletRequest request) throws Exception {
        logger.info(this.getClass().toString() + " " +
                    "metodo: selectCodPunto");
        String[] chksPunto =
            (String[])request.getSession(false).getAttribute("chksPunto");
        if (("").equals(codPunto))
            return chksPunto;
        if (chksPunto != null)
            for (int i = 0; i < chksPunto.length; i++) {
                if (chksPunto[i] != null && chksPunto[i].equals(codPunto)) {
                    break;
                }
                if (chksPunto[i] == null) {
                    chksPunto[i] = codPunto;
                    break;
                }
            }
        else {
            chksPunto = new String[1000];
            chksPunto[0] = codPunto;
        }
        request.getSession(false).setAttribute("chksPunto", chksPunto);
        return chksPunto;
    }

    @RequestMapping(params = { "accion=deselectCodPunto", "codPunto" })
    @ResponseBody
    protected String[] deselectCodPunto(@RequestParam("codPunto")
        String codPunto, @ModelAttribute(FORM_KEY)
        SelecPuntoForm form, HttpServletRequest request) throws Exception {
        logger.info(this.getClass().toString() + " " +
                    "metodo: deselectCodPunto");
        String[] chksPunto =
            (String[])request.getSession(false).getAttribute("chksPunto");

        if (chksPunto != null && chksPunto.length > 0)
            for (int i = 0; i < chksPunto.length; i++) {
                if (chksPunto[i] != null && chksPunto[i].equals(codPunto)) {
                    chksPunto[i] = null;
                    break;
                }
            }

        request.getSession(false).setAttribute("chksPunto", chksPunto);
        return chksPunto;
    }

    @RequestMapping(params = { "accion=seleccionarPuntos" })
    protected void seleccionarPuntos(ModelMap model, @ModelAttribute(FORM_KEY)
        SelecPuntoForm form, HttpServletRequest request) throws Exception {
        logger.info("seleccionarPuntos");
        String[] _chk = request.getParameterValues("_chk");
        request.getSession(false).setAttribute("_chk", _chk);
    }

    @RequestMapping(params = { "accion=selectTodos", "codTodos" })
    protected String selectTodos(@RequestParam("codTodos")
        boolean codTodos, ModelMap model,
        HttpServletRequest request) throws Exception {
        logger.info(this.getClass().toString() + " " + "metodo: GET");
        SelecPuntoForm form =
            (SelecPuntoForm)model.get("form"); //new SelecCuentaForm();

        //Asigno el check a todos los elenmentos de la lista Cuenta
        List listPuntos = form.getListPuntos();
        listPuntos = Util.setChksTodos(codTodos, listPuntos);
        form.setListPuntos(listPuntos);

        //Subo a session los todos los Checks Cuenta
        if (codTodos) {
            String[] chksPunto = Util.listToStringArray(listPuntos);
            request.getSession(false).setAttribute("chksPunto", chksPunto);
        } else {
            request.getSession(false).setAttribute("chksPunto", null);
        }

        request.getSession(false).setAttribute("listPuntos", listPuntos);
        model.put("listPuntos", listPuntos);
        model.put(FORM_KEY, form);
        return FORM_SELECT_PUNTO_CC;
    }


    @RequestMapping(params = { "accion=limpiarPuntos" })
    protected String limpiarPuntos(HttpServletRequest request) throws Exception {
        logger.info(this.getClass().toString() + " " + "metodo: GET");
        HttpSession session = request.getSession(false);
        session.setAttribute("chksPunto", null);
        ModelMap model = new ModelMap();
        model.put(FORM_KEY, new SelecPuntoForm());
        return FORM_SELECT_PUNTO_CC;
    }
}
